package proyectosimulacion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.Timer;

/**
 *
 * @author Juan Camilo
 * @author Juan David
 */
public class Puente extends Thread{
    GUI gui;
    int tamanioIzq, tamanioDer, cruzaronIzq = 0, cruzaronDer = 0, tamanioMaxIzq = 0, tamanioMaxDer = 0, numIteraciones = 0, colaPromIzq = 0, colaPromDer = 0;
    int tiempo, tiempoDer, tiempoIzq, tiempoCarrosIzq, tiempoCarrosDer;
    Timer relojIzq, relojDer, relojLlegadasIzq, relojLlegadasDer;
    boolean semaforoIzqVerde = false, semaforoDerVerde = false, ultima = false, estadoIzq = false, estadoDer = false;
    ArrayList<Integer> colaIzq = new ArrayList<>();
    ArrayList<Integer> colaDer = new ArrayList<>();
    ArrayList<Integer> resultado;
    
    public Puente(int tiempoDer, int tiempoIzq, int tiempoCarrosIzq, int tiempoCarrosDer){
        this.tiempoDer = tiempoDer;
        this.tiempoIzq = tiempoIzq;
        this.tiempoCarrosIzq = tiempoCarrosIzq;
        this.tiempoCarrosDer = tiempoCarrosDer;
    }
    
    @Override
    public void run(){
        gui = new GUI();
        gui.setVisible(true);
    }
    
    public void evento_SIV() throws InterruptedException{
        System.out.println("SIV");
        
        if (cruzaronDer > 0) {
            gui.esperar();
            sleep(120000);
            System.out.println("durmiendo");
        }
        
        semaforoDerVerde = false;
        semaforoIzqVerde = true;
        gui.cambiarSemaforo(semaforoIzqVerde);
        cruzarAIzq();

        relojIzq = new Timer(5000, new ActionListener () {
        @Override
        public void actionPerformed(ActionEvent e)
        {
                //try {
                    cruzarAIzq();
                //} catch (InterruptedException ex) {
                    //Logger.getLogger(Puente.class.getName()).log(Level.SEVERE, null, ex);
                //}
        }
        });   
        relojIzq.start();
        sleep(tiempoIzq);
        relojIzq.stop();
    }
    
    public void evento_SIR() throws InterruptedException{
        System.out.println("SIR");
        
        semaforoIzqVerde = false;
        gui.esperar();
        sleep(120000);
        
        semaforoDerVerde = true;
        gui.cambiarSemaforo(semaforoIzqVerde);
        cruzarADer();

        relojDer = new Timer(5000, new ActionListener () {
        @Override
        public void actionPerformed(ActionEvent e)
        {
                //try {
                    cruzarADer();
                //} catch (InterruptedException ex) {
                    //Logger.getLogger(Puente.class.getName()).log(Level.SEVERE, null, ex);
                //}
        }
        });
        relojDer.start();
        sleep(tiempoDer);
        relojDer.stop();
    }
    
    public void evento_CCD(){
        //generarCarroDer();
        relojLlegadasDer = new Timer(tiempoCarrosDer, new ActionListener () {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                generarCarroDer();
            } 
        });relojLlegadasDer.start();
    }
    
    public void evento_CCI(){
        relojLlegadasIzq = new Timer(tiempoCarrosIzq, new ActionListener () {
           @Override
            public void actionPerformed(ActionEvent e)
            {
                generarCarroIzq();
            } 
        });relojLlegadasIzq.start();
    }
    
    public void evento_T(){
        //try {
            //gui.terminar();
            //sleep(120000);
            resultado = new ArrayList<>();
            semaforoIzqVerde = false;
            semaforoDerVerde = false;
            gui.terminar();
            System.out.println("T");
            resultado.add(cruzaronIzq);
            resultado.add(cruzaronDer);
            resultado.add(tamanioMaxIzq);
            resultado.add(tamanioMaxDer);
            detener();
        //} catch (InterruptedException ex) {
            //Logger.getLogger(Puente.class.getName()).log(Level.SEVERE, null, ex);
        //}
        
    }
    
    public void generarCarroIzq(){
        colaIzq.add((int)System.currentTimeMillis());
        gui.actualizarContadorIzq(colaIzq.size());

        if (tamanioMaxIzq < colaIzq.size()) {
            tamanioMaxIzq = colaIzq.size();
        }
    }
    
    public void generarCarroDer(){
        colaDer.add((int)System.currentTimeMillis());
        gui.actualizarContadorDer(colaDer.size());

        if (tamanioMaxDer < colaDer.size()) {
            tamanioMaxDer = colaDer.size();
        }
    }
    
    public void cruzarAIzq() {//throws InterruptedException{
        if (colaIzq.size() > 0) {
            colaIzq.remove(0);
            gui.actualizarContadorIzq(colaIzq.size());
            //sleep(120000);
            cruzaronIzq++;
            gui.actualizarAutosCruzaronDer(cruzaronIzq);
            
        }
    }
    
    public void cruzarADer() { //throws InterruptedException{
        if (colaDer.size() > 0) {
            colaDer.remove(0);
            gui.actualizarContadorDer(colaDer.size());
            //sleep(120000);
            cruzaronDer++;
            gui.actualizarAutosCruzaronIzq(cruzaronDer);
        }
    }
    
    public void detener(){
        relojIzq.stop();
        relojDer.stop();
        relojLlegadasIzq.stop();
        relojLlegadasDer.stop();
        JOptionPane.showMessageDialog(null, "Carros Cruzaron Izq a Der: " + resultado.get(0) + 
                "\nCarros Cruzaron Der a Izq: " + resultado.get(1) + 
                "\nTamaño Maximo Cola Izq: " + resultado.get(2) +
                "\nTamaño Maximo Cola Der: " + resultado.get(3));
        gui.terminar();
    }
}
